package com.kucai.yifaqapp.util;

import android.content.Context;
import android.graphics.Color;

import com.bigkoo.pickerview.TimePickerView;
import com.kucai.yifaqapp.R;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * Created by Administrator on 2017/8/28.
 * 日期选择工具类
 */

public class DateSelector {

    private DateSelector() {
    }

    /**
     * @param context  上下文
     * @param listener 点击回调监听
     * @return 获得时间选择控件
     */
    public static TimePickerView getPvTime(Context context, TimePickerView.OnTimeSelectListener listener) {
        return getDater(context, listener, -1, -1, -1, -1, -1, -1);
    }

    /**
     * @param context  上下文
     * @param yyyyMMdd 年月日
     * @param listener 点击回调监听
     * @return 获得时间选择控件
     */
    public static TimePickerView getPvDate(Context context, String yyyyMMdd, TimePickerView.OnTimeSelectListener listener) {
        return getDater(context, listener, -1, -1, -1, -1, -1, -1);
    }

    //向前
    public static TimePickerView getPvDatePreDay(Context context, TimePickerView.OnTimeSelectListener listener) {
        Calendar c = Calendar.getInstance();
        return getDater(context, listener, -1, -1, -1, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
    }

    //向后
    public static TimePickerView getPvDateToDay(Context context, TimePickerView.OnTimeSelectListener listener) {
        Calendar c = Calendar.getInstance();
        return getDater(context, listener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), -1, -1, -1);
    }

    private static TimePickerView getDater(Context context,
                                           TimePickerView.OnTimeSelectListener listener,
                                           int yearStart,
                                           int monthStart,
                                           int dayStart,
                                           int yearEnd,
                                           int monthEnd,
                                           int dayEnd) {
        //控制时间范围(如果不设置范围，则使用默认时间1900-2100年，此段代码可注释)
        //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
        Calendar selectedDate = Calendar.getInstance();
        Calendar startDate = Calendar.getInstance();
        if (yearStart < 0 || monthStart < 0 || dayStart < 0)
            startDate.set(2018, 10, 25);
        else
            startDate.set(yearStart, monthStart, dayStart);

        Calendar endDate = Calendar.getInstance();
        if (yearEnd < 0 || monthEnd < 0 || dayEnd < 0)
            endDate.set(2099, 11, 31);
        else
            endDate.set(yearEnd, monthEnd, dayEnd);
        //时间选择器
        return new TimePickerView.Builder(context, listener)
                .setSubmitText(context.getString(R.string.confirm))//确定按钮文字
                .setCancelText(context.getString(R.string.cancel))//取消按钮文字
                //年月日时分秒 的显示与否，不设置则默认全部显示
                .setType(new boolean[]{true, true, true, false, false, false})
                .setLabel("年", "月", "日", "", "", "")
                .isCenterLabel(false)
                .setDividerColor(Color.DKGRAY)
                .setContentSize(21)
                .setDate(selectedDate)
                .setRangDate(startDate, endDate)
                .setBackgroundId(0x00FFFFFF) //设置外部遮罩颜色
                .setDecorView(null)
                .build();
    }



    /**
     * 获取时间
     *
     * @param date
     * @return
     */
    public static String getTimeString(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        return format.format(date);
    }

    /**
     * 获取日期String类型
     *
     * @param date
     * @return
     */
    public static String getDateString(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        return format.format(date);
    }
    /**
     * 获取传给后台的日期String类型
     *
     * @param date
     * @return
     */
    public static String getDateString2(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        return format.format(date);
    }

    /**
     * 获取日期Date类型
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date getDate(String date) throws ParseException {
        return new SimpleDateFormat("yyyy-MM-dd").parse(date);
    }

    /**
     * 今日开始，限制结束日期
     *
     * @param context
     * @param listener
     * @param yyyy
     * @param MM
     * @param dd
     */
    public static TimePickerView getPvTimeToDayLimitEnd(Context context, TimePickerView.OnTimeSelectListener listener, int yyyy, int MM, int dd) {
        Calendar c = Calendar.getInstance();
        return getDater(context, listener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), yyyy, MM, dd);
    }

    public static TimePickerView getPvTimeToDayLimitStart(Context context, TimePickerView.OnTimeSelectListener listener, int yyyy, int MM, int dd) {
        return getDater(context, listener, yyyy, MM, dd, -1, -1, -1);
    }

    public static TimePickerView getBetweenTwoDays(Context context, TimePickerView.OnTimeSelectListener listener, Calendar c1, Calendar c2) {
        return getDater(context, listener, c1.get(Calendar.YEAR), c1.get(Calendar.MONTH), c1.get(Calendar.DAY_OF_MONTH), c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH));
    }

    /**
     * 通过时间秒毫秒数判断两个时间的间隔
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDaysByMillisecond(Date date1, Date date2) {
        int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
        return days;
    }

    /**
     * 计算两个日期型的时间相差多少时间
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return
     */
    public static String twoDateDistance(Date startDate, Date endDate) {

        if (startDate == null || endDate == null) {
            return null;
        }
        long timeLong = endDate.getTime() - startDate.getTime();
        /**
         * 新闻时间显示规则：
         情况1：对于1小时内发出的新闻，时间显示“刚刚”
         情况2：对于1小时外24小时内发出的新闻，从发出时间计算，如发了两个小时了，就显示“2小时”
         情况3：对于24小时外48小时内发出的新闻，时间显示“一天前”
         情况4：对于48小时外发出的新闻，时间显示“年-月-日”，如“2017-01-01”注意月和日是两位数字
         */
        if (timeLong < 60 * 1000)
            return timeLong / 1000 + "秒前";
        else if (timeLong < 60 * 60 * 1000) {
            timeLong = timeLong / 1000 / 60;
            return timeLong + "分钟前";
        } else if (timeLong < 60 * 60 * 24 * 1000) {
            timeLong = timeLong / 60 / 60 / 1000;
            return timeLong + "小时前";
        } else if (timeLong < 60 * 60 * 24 * 1000 * 7) {
            timeLong = timeLong / 1000 / 60 / 60 / 24;
            return timeLong + "天前";
        } else if (timeLong < 60 * 60 * 24 * 1000 * 7 * 4l) {
            timeLong = timeLong / 1000 / 60 / 60 / 24 / 7;
            return timeLong + "周前";
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
            return sdf.format(startDate);
        }
    }

    /**
     * 计算两个日期型的时间相差多少时间
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     *                  新闻时间显示规则：
     *                  情况1：对于1小时内发出的新闻，时间显示“刚刚”
     *                  情况2：对于1小时外24小时内发出的新闻，从发出时间计算，如发了两个小时了，就显示“2小时”
     *                  情况3：对于24小时外48小时内发出的新闻，时间显示“一天前”
     *                  情况4：对于48小时外发出的新闻，时间显示“年-月-日”，如“2017-01-01”注意月和日是两位数字
     * @return
     */
    public static String twoDateDistance2(Date startDate, Date endDate) {

        if (startDate == null || endDate == null) {
            return null;
        }
        long timeLong = endDate.getTime() - startDate.getTime();
        if (timeLong < 60 * 60 * 1000)
            return "刚刚";
        else if (timeLong < 24 * 60 * 60 * 1000) {
            timeLong = timeLong / 60 / 60 / 1000;
            return timeLong + "小时前";
        } else if (timeLong < 48 * 60 * 60 * 1000) {
            return "一天前";
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
            return sdf.format(startDate);
        }
    }

    public static String long2Time(long l) {
        StringBuilder stringBuilder = new StringBuilder();
        if (l > 24 * 60 * 60 * 1000) {
            stringBuilder.append(l / (24 * 60 * 60 * 1000) + "天前");
            l = l % (24 * 60 * 60 * 1000);
        }
        if (l > 60 * 60 * 1000) {
            stringBuilder.append(l / (60 * 60 * 1000) + "小时前");
            l = l % (60 * 60 * 1000);
        } else {
            stringBuilder.append("0小时");
        }
        if (l > 60 * 1000) {
            stringBuilder.append(l / (60 * 1000) + "分");
            l = l % (60 * 1000);
        } else {
            stringBuilder.append("0分");
        }
        stringBuilder.append(l / 1000 + "秒");
        return stringBuilder.toString();
    }

    /**
     * 获取星期几
     *
     * @param calendar
     * @return
     */
    public static String getDayOfWeek(Calendar calendar) {
        switch (calendar.get(Calendar.DAY_OF_WEEK)) {
            case Calendar.SUNDAY:
                return "星期日";
            case Calendar.MONDAY:
                return "星期一";
            case Calendar.TUESDAY:
                return "星期二";
            case Calendar.WEDNESDAY:
                return "星期三";
            case Calendar.THURSDAY:
                return "星期四";
            case Calendar.FRIDAY:
                return "星期五";
            case Calendar.SATURDAY:
                return "星期六";
        }
        return "";
    }
}
